/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.util.ArrayList;
import javax.faces.context.FacesContext;
import org.cip.esymons.eventos.adapaters.CalendarioAmbientesAdapter;
import org.cip.esymons.eventos.adapaters.RutaCarpetaReporte;
import org.cip.esymons.eventos.be.Contrato;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.be.PersonaNatural;
import java.io.File;
import java.io.FileInputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.cip.esymons.eventos.adapaters.ReservaAmbienteAdapter;
import org.cip.esymons.eventos.bc.ComprobanteAdapter;
import org.cip.esymons.eventos.bc.ContratoDelegate;
import org.cip.esymons.eventos.bc.MontosComprobanteAdapter;
import org.cip.esymons.eventos.bc.MovimientoCuentaDelegate;
import org.cip.esymons.eventos.bc.ReservaAmbienteAgrupadaAdapter;
import org.cip.esymons.eventos.bc.ReservaAmbienteDelegate;
import org.cip.esymons.eventos.be.Ambiente;
import org.cip.esymons.eventos.be.ReservaAmbiente;
import org.cip.esymons.eventos.be.ServicioEquipo;
//import org.cip.esymons.general.be.DireccionPersona;
import org.cip.esymons.general.be.DireccionPersona;
import org.cip.esymons.general.be.Igv;
import org.cip.esymons.general.util.Utiles;
import org.cip.esymons.tesoreria.be.CuentaIngreso;
import org.cip.esymons.tesoreria.be.EnumEstadoMovimiento;
import org.cip.esymons.tesoreria.be.EnumTipoDeuda;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.TipoMoneda;

/**
 *
 * @author Lizardo
 */
public class ContratoAlquilerController {

    String dni = "";
    String paterno = "";
    String materno = "";
    String nombres = "";
    String ruc = "";
    String razonSocial = "";
    String nombrePersona = "";
    String direccion = "";
    String nombreEvento = "";
    String nombreEmpresa = "";
    String tabber = "busquedas";
    String nombreDscto = "Descuento";

    Integer banTipo;
    Boolean banBotonConfirmar;
    Integer tipoDescuento;
    Integer tipoAmbiente;
    Double garantia;
    Double subTotal;
    Double igv; //muestra el igv vigente 19% lee de la tabla gen_igv
    Double igvContrato;
    Double montoSinDescuento;
    Double descuentoPorcentaje;
    Double descuento;
    Double montoTotal;
    Double montoAPagar;
    Boolean tipoPersona;
    Boolean contratanteSeleccionado;
    Boolean muestraReservas;
    Date fechaAmbiente = new Date();
    Boolean ocultarEvento = false;
//    Date fecha;
//    Boolean var;

    PersonaNatural persona;
    PersonaNatural personaSeleccionada;
    PersonaJuridica empresa;
    PersonaJuridica empresaSeleccionada;
    Contrato contrato;
    Contrato contratoSeleccionado;
    ReservaAmbiente reserva;
    ReservaAmbiente reservaSeleccionada;
    Ambiente ambiente;
    ServicioEquipo equipo;

    ContratoDelegate delegateContrato;
    ReservaAmbienteDelegate delegate;

    List<PersonaNatural> listaPersonas;
    List<PersonaJuridica> listaEmpresa;
    List<CalendarioAmbientesAdapter> listaCalendario;
    List<CalendarioAmbientesAdapter> listaCalendario1;
    List<Contrato> listaContrato;
    List<ReservaAmbiente> listaReservas;
    List<ReservaAmbienteAdapter> listaReservasAdapter;
    MontosComprobanteAdapter montos;
    List<ComprobanteAdapter> listaComprobante;

    public ContratoAlquilerController() {
        inicializar();
    }

    public String inicializar() {
        listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
        listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();

        listaReservasAdapter = new ArrayList<ReservaAmbienteAdapter>();
        listaComprobante = new ArrayList<ComprobanteAdapter>();
        montos = new MontosComprobanteAdapter();

        persona = new PersonaNatural();
        personaSeleccionada = new PersonaNatural();
        empresa = new PersonaJuridica();
        empresaSeleccionada = new PersonaJuridica();
        contrato = new Contrato();
        contratoSeleccionado = new Contrato();
        delegateContrato = new ContratoDelegate();
        delegate = new ReservaAmbienteDelegate();

        listaPersonas = new ArrayList<PersonaNatural>();
        listaEmpresa = new ArrayList<PersonaJuridica>();
        listaContrato = new ArrayList<Contrato>();

        muestraReservas = false;
        tipoAmbiente = 1;   //Para un ambiente
        fechaAmbiente = new Date();
        equipo = new ServicioEquipo();
//        igv = 9D;
        igv = mostrarIgvVigente();
        return null;
    }

    //<editor-fold defaultstate="collapsed" desc="Gets y Sets">
    public Integer getBanTipo() {
        return banTipo;
    }

    public void setBanTipo(Integer banTipo) {
        this.banTipo = banTipo;
    }

    public Contrato getContrato() {
        return contrato;
    }

    public void setContrato(Contrato contrato) {
        this.contrato = contrato;
    }

    public Contrato getContratoSeleccionado() {
        return contratoSeleccionado;
    }

    public void setContratoSeleccionado(Contrato contratoSeleccionado) {
        this.contratoSeleccionado = contratoSeleccionado;
    }

    public Double getDescuento() {
        return descuento;
    }

    public void setDescuento(Double descuento) {
        this.descuento = descuento;
    }

    public Double getDescuentoPorcentaje() {
        return descuentoPorcentaje;
    }

    public void setDescuentoPorcentaje(Double descuentoPorcentaje) {
        this.descuentoPorcentaje = descuentoPorcentaje;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public PersonaJuridica getEmpresa() {
        return empresa;
    }

    public void setEmpresa(PersonaJuridica empresa) {
        this.empresa = empresa;
    }

    public PersonaJuridica getEmpresaSeleccionada() {
        return empresaSeleccionada;
    }

    public void setEmpresaSeleccionada(PersonaJuridica empresaSeleccionada) {
        this.empresaSeleccionada = empresaSeleccionada;
    }

    public Double getGarantia() {
        return garantia;
    }

    public void setGarantia(Double garantia) {
        this.garantia = garantia;
    }

    public Double getIgv() {
        mostrarIgvVigente();
        return igv;
    }

    public void setIgv(Double igv) {
        this.igv = igv;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario() {
        return listaCalendario;
    }

    public void setListaCalendario(List<CalendarioAmbientesAdapter> listaCalendario) {
        this.listaCalendario = listaCalendario;
    }

    public List<CalendarioAmbientesAdapter> getListaCalendario1() {
        return listaCalendario1;
    }

    public void setListaCalendario1(List<CalendarioAmbientesAdapter> listaCalendario1) {
        this.listaCalendario1 = listaCalendario1;
    }

    public List<Contrato> getListaContrato() {
        return listaContrato;
    }

    public void setListaContrato(List<Contrato> listaContrato) {
        this.listaContrato = listaContrato;
    }

    public List<PersonaJuridica> getListaEmpresa() {
        return listaEmpresa;
    }

    public void setListaEmpresa(List<PersonaJuridica> listaEmpresa) {
        this.listaEmpresa = listaEmpresa;
    }

    public List<PersonaNatural> getListaPersonas() {
        return listaPersonas;
    }

    public void setListaPersonas(List<PersonaNatural> listaPersonas) {
        this.listaPersonas = listaPersonas;
    }

    public String getMaterno() {
        return materno;
    }

    public void setMaterno(String materno) {
        this.materno = materno;
    }

    public Double getMontoSinDescuento() {
        return montoSinDescuento;
    }

    public void setMontoSinDescuento(Double montoSinDescuento) {
        this.montoSinDescuento = montoSinDescuento;
    }

    public Double getMontoTotal() {
        return montoTotal;
    }

    public void setMontoTotal(Double montoTotal) {
        this.montoTotal = montoTotal;
    }

    public String getNombreEvento() {
        return nombreEvento;
    }

    public void setNombreEvento(String nombreEvento) {
        this.nombreEvento = nombreEvento;
    }

    public String getNombrePersona() {
        mostrarPersona();
        return nombrePersona;
    }

    public void setNombrePersona(String nombrePersona) {
        this.nombrePersona = nombrePersona;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getPaterno() {
        return paterno;
    }

    public void setPaterno(String paterno) {
        this.paterno = paterno;
    }

    public PersonaNatural getPersona() {
        return persona;
    }

    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public PersonaNatural getPersonaSeleccionada() {
        return personaSeleccionada;
    }

    public void setPersonaSeleccionada(PersonaNatural personaSeleccionada) {
        this.personaSeleccionada = personaSeleccionada;
    }

    public String getRazonSocial() {
        return razonSocial;
    }

    public void setRazonSocial(String razonSocial) {
        this.razonSocial = razonSocial;
    }

    public String getRuc() {
        return ruc;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    public Double getSubTotal() {
        return subTotal;
    }

    public void setSubTotal(Double subTotal) {
        this.subTotal = subTotal;
    }

    public Integer getTipoDescuento() {
        return tipoDescuento;
    }

    public void setTipoDescuento(Integer tipoDescuento) {
        this.tipoDescuento = tipoDescuento;
    }

    public Boolean getTipoPersona() {
        return tipoPersona;
    }

    public void setTipoPersona(Boolean tipoPersona) {
        this.tipoPersona = tipoPersona;
    }

    public Boolean getContratanteSeleccionado() {
        return contratanteSeleccionado;
    }

    public void setContratanteSeleccionado(Boolean contratanteSeleccionado) {
        this.contratanteSeleccionado = contratanteSeleccionado;
    }

    public ReservaAmbienteDelegate getDelegate() {
        return delegate;
    }

    public void setDelegate(ReservaAmbienteDelegate delegate) {
        this.delegate = delegate;
    }

    public ContratoDelegate getDelegateContrato() {
        return delegateContrato;
    }

    public void setDelegateContrato(ContratoDelegate delegateContrato) {
        this.delegateContrato = delegateContrato;
    }

    public String getNombreEmpresa() {
        mostrarEmpresa();
        return nombreEmpresa;
    }

    public void setNombreEmpresa(String nombreEmpresa) {
        this.nombreEmpresa = nombreEmpresa;
    }

    public String getTabber() {
        return tabber;
    }

    public void setTabber(String tabber) {
        this.tabber = tabber;
    }

    public Boolean getMuestraReservas() {
        return muestraReservas;
    }

    public void setMuestraReservas(Boolean muestraReservas) {
        this.muestraReservas = muestraReservas;
    }

    public List<ReservaAmbiente> getListaReservas() {
        return listaReservas;
    }

    public void setListaReservas(List<ReservaAmbiente> listaReservas) {
        this.listaReservas = listaReservas;
    }

    public String getNombreDscto() {
        dameNombreDscto();
        return nombreDscto;
    }

    public void setNombreDscto(String nombreDscto) {
        this.nombreDscto = nombreDscto;
    }

    public ReservaAmbiente getReserva() {
        return reserva;
    }

    public void setReserva(ReservaAmbiente reserva) {
        this.reserva = reserva;
    }

    public ReservaAmbiente getReservaSeleccionada() {
        return reservaSeleccionada;
    }

    public void setReservaSeleccionada(ReservaAmbiente reservaSeleccionada) {
        this.reservaSeleccionada = reservaSeleccionada;
    }

    public ServicioEquipo getEquipo() {
        return equipo;
    }

    public void setEquipo(ServicioEquipo equipo) {
        this.equipo = equipo;
    }

    public Date getFechaAmbiente() {
        return fechaAmbiente;
    }

    public void setFechaAmbiente(Date fechaAmbiente) {
        this.fechaAmbiente = fechaAmbiente;
    }

    public Integer getTipoAmbiente() {
        return tipoAmbiente;
    }

    public void setTipoAmbiente(Integer tipoAmbiente) {
        this.tipoAmbiente = tipoAmbiente;
    }

    public Ambiente getAmbiente() {
        return ambiente;
    }

    public void setAmbiente(Ambiente ambiente) {
        this.ambiente = ambiente;
    }

    public Boolean getOcultarEvento() {
        return ocultarEvento;
    }

    public void setOcultarEvento(Boolean ocultarEvento) {
        this.ocultarEvento = ocultarEvento;
    }

    public Double getIgvContrato() {
        return igvContrato;
    }

    public void setIgvContrato(Double igvContrato) {
        this.igvContrato = igvContrato;
    }

    public List<ReservaAmbienteAdapter> getListaReservasAdapter() {
        return listaReservasAdapter;
    }

    public void setListaReservasAdapter(List<ReservaAmbienteAdapter> listaReservasAdapter) {
        this.listaReservasAdapter = listaReservasAdapter;
    }

    public Boolean getBanBotonConfirmar() {
        return banBotonConfirmar;
    }

    public void setBanBotonConfirmar(Boolean banBotonConfirmar) {
        this.banBotonConfirmar = banBotonConfirmar;
    }

    



    // // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Validaciones">
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public String limpiarBusquedas() {
        dni = "";
        paterno = "";
        materno = "";
        nombres = "";
        ruc = "";
        razonSocial = "";
        banTipo = 0;
        contratanteSeleccionado = false;
        if (persona != null) {
            persona = new PersonaNatural();
        }
//        if (empresa != null) {
//            empresa = new PersonaJuridica();
//        }
        if (personaSeleccionada != null) {
            personaSeleccionada = new PersonaNatural();
        }
//        if (empresaSeleccionada != null) {
//            empresaSeleccionada = new PersonaJuridica();
//        }
        listaPersonas = new ArrayList<PersonaNatural>();
        listaEmpresa  = new ArrayList<PersonaJuridica>();
        return null;
    }

    // // </editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Agregar/Quitar Ambientes/Equipos">
//    public String agregarAmbSeleccionados() {
//        for (CalendarioAmbientesAdapter cal : listaCalendario) {
//            if (cal.getReservar()) {
//                cal.setFecha(fecha);
//                listaCalendario1.add(cal);
//                subTotal = subTotal + cal.getCosto();
//            }
//        }
//        for (CalendarioAmbientesAdapter cal : listaCalendario1) {
//            listaCalendario.remove(cal);
//        }
//        subTotal = redondear(subTotal, 2);
//        return "";
//    }
//
//    public String quitarAmbSeleccionados() {
//        try {
//            listaCalendario.add(ambienteSeleccionado);
//            listaCalendario1.remove(ambienteSeleccionado);
//            subTotal = subTotal - ambienteSeleccionado.getCosto();
//        } catch (Exception e) {
//        }
//        subTotal = redondear(subTotal, 2);
//        return "";
//    }
    // // </editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Buscar Contratante">
//    public String buscarXDNI() {
//        try {
//            perNatural = new PersonaNatural();
//            perNatural = delegateNatural.buscarXDNI(dni);
//            try {//Buscar Direccion
//                List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
//                DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
//                listaDirecciones = delegateTelefono.listaDirecciones(perNatural.getSolCodigo());
//                direccion = listaDirecciones.get(0).getDpeDireccion();
//            } catch (Exception ex) {
//            }
//            try {//Buscar Telefono
//                List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
//                TelefonoDelegate delegateTelefono = new TelefonoDelegate();
//                listaTelefonos = delegateTelefono.buscarXSolicitante(perNatural.getSolCodigo());
//                telefono = listaTelefonos.get(0).getTsoNumero();
//            } catch (Exception ex) {
//            }
//            email = perNatural.getSolcorreopersonal1();
//            ruc = perNatural.getSolRUC();
//        } catch (Exception e) {
//            //En caso de no econtrar la persona con el respectivo DNI
//            limpiarBusquedas();
//            mostrarMensaje("Error: ", "No existe ninguna Persona Registrada con ese Numero de DNI", FacesMessage.SEVERITY_ERROR);
//        }
//        return "";
//    }
//
//    public String buscarXRUC() {
//        try {
//            SolicitanteDelegate delegateSolicitante = new SolicitanteDelegate();
//            if (tipo.equals("0")) {
//                perNatural = new PersonaNatural();
//                try {
//                    Long lruc = delegateSolicitante.buscarxRuc(ruc);
//                    perNatural = delegateNatural.buscarxId(lruc);
//                    dni = perNatural.getPerNroDNI();
//                    email = perNatural.getSolcorreopersonal1();
//                    try {//Buscar Direccion
//                        List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
//                        DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
//                        listaDirecciones = delegateTelefono.listaDirecciones(perNatural.getSolCodigo());
//                        direccion = listaDirecciones.get(0).getDpeDireccion();
//                    } catch (Exception ex) {
//                    }
//                    try {//Buscar Telefono
//                        List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
//                        TelefonoDelegate delegateTelefono = new TelefonoDelegate();
//                        listaTelefonos = delegateTelefono.buscarXSolicitante(perNatural.getSolCodigo());
//                        telefono = listaTelefonos.get(0).getTsoNumero();
//                    } catch (Exception ex) {
//                    }
//                } catch (Exception e) {
//                    limpiarBusquedas();
//                    mostrarMensaje("Error: ", "No existe ninguna Persona con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
//                }
//            } else {
//                perJuridica = new PersonaJuridica();
//                try {
//                    Long lruc = delegateSolicitante.buscarxRuc(ruc);
//                    perJuridica = delegateJuridica.buscarxId(lruc);
//                    email = perJuridica.getSolcorreopersonal1();
//                    try {//Buscar Direccion
//                        List<DireccionPersona> listaDirecciones = new ArrayList<DireccionPersona>();
//                        DireccionPersonaDelegate delegateTelefono = new DireccionPersonaDelegate();
//                        listaDirecciones = delegateTelefono.listaDirecciones(perJuridica.getSolCodigo());
//                        direccion = listaDirecciones.get(0).getDpeDireccion();
//                    } catch (Exception ex) {
//                    }
//                    try {//Buscar Telefono
//                        List<TelefonoSolicitante> listaTelefonos = new ArrayList<TelefonoSolicitante>();
//                        TelefonoDelegate delegateTelefono = new TelefonoDelegate();
//                        listaTelefonos = delegateTelefono.buscarXSolicitante(perJuridica.getSolCodigo());
//                        telefono = listaTelefonos.get(0).getTsoNumero();
//                    } catch (Exception ex) {
//                    }
//                } catch (Exception e) {
//                    limpiarBusquedas();
//                    mostrarMensaje("Error: ", "No existe ninguna Empresa con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
//                }
//            }
//        } catch (Exception e) {
//            perNatural = new PersonaNatural();
//            perJuridica = new PersonaJuridica();
//            mostrarMensaje("Error: ", "No existe ninguna Persona/Empresa con ese nÃƒÂºmero de RUC", FacesMessage.SEVERITY_ERROR);
//        }
//        return "";
//    }

    // // </editor-fold>

    public String buscarPersonaPorDni() {
        try {
            dni = (dni != null) ? dni : "";
            persona = delegate.buscarDni(dni);
            if (persona != null) {
                contratanteSeleccionado = true;
            } else {
                persona = new PersonaNatural();
                contratanteSeleccionado = false;
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al buscar el dni de la persona", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        banTipo = 1; //para mostrar los datos de la persona
        return null;
    }

    public String buscarPersonaPorApellidosyNombres() {
        try {
            listaPersonas = delegate.buscarPersona(paterno, materno, nombres);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al buscar a la persona por apellidos y nombres", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        banTipo = 2; //para mostrar los datos de la persona en una tabla
        return null;
    }

    public String buscarEmpresaPorRuc() {
        try {
            ruc = (ruc != null) ? ruc : "";
            empresa = delegate.buscaRuc(ruc);
            if (empresa != null) {
                contratanteSeleccionado = true;
            } else {
                empresa = new PersonaJuridica();
                contratanteSeleccionado = false;
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al buscar el ruc de la empresa", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        banTipo = 3; //para mostrar los datos de la empresa
        return null;
    }

    public String buscarEmpresaPorRazonSocial() {
        try {
            razonSocial = (razonSocial != null) ? razonSocial : "";
            listaEmpresa = delegate.listaRazonSocial(razonSocial);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al buscar la razón social de la empresa", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        banTipo = 4; //para mostrar los datos de la empresa
        return null;
    }

    public String seleccionarContratante() {
        contratanteSeleccionado = false;
        if (personaSeleccionada != null) {
            contratanteSeleccionado = true;
        }
        if (empresaSeleccionada != null) {
            contratanteSeleccionado = true;
        }
        return null;
    }

    private void mostrarPersona() {
        switch (banTipo) {
            case 1:
                nombrePersona = (persona != null) ? persona.getApellidosNombres() : "<No se encontró a la persona>";
                break;
            case 2:
                nombrePersona = (personaSeleccionada != null) ? personaSeleccionada.getApellidosNombres() : "<No se encontró a la persona>";
        }
    }

    private void mostrarEmpresa() {
        switch (banTipo) {
            case 3:
                nombreEmpresa = (empresa != null) ? empresa.getEmprazonSocial() : "<No se encontró el nombre de la empresa>";
                break;
            case 4:
                nombreEmpresa = (empresaSeleccionada != null) ? empresaSeleccionada.getEmprazonSocial() : "<No se encontró el nombre de la empresa>";
        }
    }

    public Long dameSolCodigo() {
        Long retorno = 0L;
        switch (banTipo) {
            case 1:
                if (persona != null) {
                    retorno = persona.getSolCodigo();
                }
                tipoPersona = false;
                break;
            case 2:
                if (personaSeleccionada != null) {
                    retorno = personaSeleccionada.getSolCodigo();
                }
                tipoPersona = false;
                break;
            case 3:
                if (empresa != null) {
                    retorno = empresa.getSolCodigo();
                }
                tipoPersona = true;
                break;
            case 4:
                if (empresaSeleccionada != null) {
                    retorno = empresaSeleccionada.getSolCodigo();
                }
                tipoPersona = true;
        }
        return retorno;
    }

    public String irAlPaso2() {
        tabber = "confirmar";
        Long solCodigo = 0L;
        try {
            if (contratanteSeleccionado) {
                solCodigo = dameSolCodigo();
                listaContrato = delegateContrato.listarContratos(solCodigo);
                System.out.println("cantidad de contratos: " + listaContrato.size());
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar los contratos...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String anularReserva() {
        try {
            delegate.eliminar(reservaSeleccionada);
            buscarReservas();
            mostrarMensaje("WARN: ", "Reserva anulada, debe recalcular los montos y guardarlos nuevamente", FacesMessage.SEVERITY_WARN);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En eliminar la reserva del ambiente", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String buscarReservas() {
        Integer conCodigo = 0;
        try {
            conCodigo = (contratoSeleccionado != null) ? contratoSeleccionado.getConCodigo() : 0;
            listaReservas = delegate.listarReservas(conCodigo);
            muestraReservas = true;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En buscar las reservas del contratante", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String ocultarReservas() {
        muestraReservas = false;
        return null;
    }

    public Double calcularIgv(Double dblSubTotal) {
        Double dblIgv = 0D;
        try {
            Double porcIgv = mostrarIgvVigente();
            dblIgv = dblSubTotal * (porcIgv);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En calcular el igv", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            dblIgv = 0D;
        }
        return dblIgv;
    }

    public Double dameDescuento(Double dblSubTotal, Double dblDescuento){
        tipoDescuento = contratoSeleccionado.getConTipoDscto();
        tipoDescuento = (tipoDescuento != null) ? tipoDescuento : 0;
        switch (tipoDescuento) {
            case 0: dblDescuento = 0D;   break;
            case 1: dblDescuento = dblSubTotal * (dblDescuento / 100); break;
            case 2: System.out.println("Descuento: " + dblDescuento);
        }
        dblDescuento = Utiles.redondearDouble(dblDescuento, 2);
        return dblDescuento;
    }

    public Double calcularSubTotal(Double dblSubTotal, Double dblDescuento) {
        Double porcIgv = mostrarIgvVigente();
        //dblDescuento = dameDescuento(dblSubTotal, dblDescuento);
        if (dblDescuento > 0) {
            dblSubTotal -= dblDescuento;
        }
        dblSubTotal /= (1 + porcIgv);
        return dblSubTotal;
    }

//    public Double calcularMontoAPagar(Double dblMontoTotal, Double descuento) {
//        switch (tipoDescuento) {
//            case 0: descuento = 0D; break;
//            case 1: descuento = dblMontoTotal * (descuento / 100);  break;
//            case 2: System.out.println("descuento: " + descuento);
//        }
//        montoAPagar = dblMontoTotal - descuento;
//        return montoAPagar;
//    }

    public String actualizarTipoDscto() {
        try {
            contratoSeleccionado.setConTipoDscto(tipoDescuento);
            delegateContrato.actualizar_Contrato(contratoSeleccionado);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En actualizar tipo descuento", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String guardarContrato() {
        try {
            calcularMontosXcontrato();
            delegateContrato.guardar_Contrato(contratoSeleccionado);
            mostrarMensaje("Exito: ", "El contrato se guardo con éxito", FacesMessage.SEVERITY_WARN);
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "En guardar contrato alquiler...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public String guardarContratoEnLista() {
        try {
            for (Contrato con : listaContrato) {
                //Integer tipoDscto = (con.getConTipoDscto() != null) ? con.getConTipoDscto() : 0;
                calcularMontosXcontrato();
                delegateContrato.guardar_Contrato(con);
            }
            mostrarMensaje("EXITO: ", "Los contratos se guardaron con éxito", FacesMessage.SEVERITY_WARN);
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "En guardar contrato alquiler...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public void llenarDatosAntesVisualizar() {
        //lizardo estuvo aqui
        //calcularMontosEnLista();
        //List<ReservaAmbienteAgrupadaAdapter> listaReservasAgrupadas = new
        try {
            listaReservasAdapter = new ArrayList<ReservaAmbienteAdapter>();
            calcularMontosXcontrato();
            buscarReservas();
            //buscar reservas agrupadas

            int cantidad = listaReservas.size();
            Double costo = subTotal / cantidad;
            Double monto = 0D;
            costo = Utiles.redondearDouble(costo, 2);
            int i = 0;
            for (ReservaAmbiente amb : listaReservas) {
                ReservaAmbienteAdapter res = new ReservaAmbienteAdapter();
                i++;
                res.setAmbienteServicio((amb.getReaTipoae()==0) ? amb.getAmbCodigo().getAmbNombre() : amb.getSerCodigo().getSerNombre());
                res.setFechaReserva(amb.getReaFecha());
                res.setHorarioReserva(amb.getHoraInicio() + " - " + amb.getHoraFin());
                if (i<cantidad) {
                    monto += costo;
                } else {
                    costo = subTotal - monto;
                }
                res.setCostoSinIgv(costo);
                res.setImporteSinIgv(costo);
                listaReservasAdapter.add(res);
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al visualizar el contrato alquiler", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        muestraReservas = false;
    }

    public void llenarDatosAntesVisualizarV2() {
        //lizardo estuvo aqui
        try {
            listaComprobante = new ArrayList<ComprobanteAdapter>();
            montos = new MontosComprobanteAdapter();
            descuento = dameDescuento(contratoSeleccionado.getSubTotalRedondeado(), contratoSeleccionado.getCondescuento());
            listaComprobante = delegateContrato.recalcularComprobante(contratoSeleccionado.getConCodigo(), descuento);
            montos = delegateContrato.getMontosComprobante();
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al visualizar el contrato alquiler", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
       // muestraReservas = false;
    }

    public String calcularMontosXcontrato() {
        try {
            Double dblDescuento = contratoSeleccionado.getCondescuento();
            dblDescuento = (dblDescuento != null) ? dblDescuento : 0D;
            Double dblSubTotal = delegateContrato.calcularSubTotal(contratoSeleccionado);
            dblSubTotal = (dblSubTotal != null) ? dblSubTotal : 0D;
            montoTotal = dblSubTotal;
            montoSinDescuento = calcularSubTotal(dblSubTotal, 0.0);
            dblDescuento = dameDescuento(dblSubTotal, dblDescuento);
            dblSubTotal = calcularSubTotal(dblSubTotal, dblDescuento);
            Double dblIgv = calcularIgv(dblSubTotal);
            Double dblMontoTotal = dblSubTotal + dblIgv;
            Double dblMontoAPagar = dblMontoTotal;
            //inicio valores para el pdf
            igvContrato = dblIgv;
            //montoTotal = dblMontoTotal;
            subTotal = dblSubTotal;
            descuento = dblDescuento;
            montoAPagar = dblMontoAPagar;
            //fin valores
            contratoSeleccionado.setConsubTotal(dblSubTotal);
            contratoSeleccionado.setConIGV(dblIgv);
            contratoSeleccionado.setCodmontoTotal(dblMontoTotal);
            contratoSeleccionado.setConApagar(dblMontoAPagar);
            delegateContrato.actualizar_Contrato(contratoSeleccionado);
            mostrarMensaje("INFO: ", "Se calculo con exito este contrato", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En calcular los montos del contrato N°: " + contratoSeleccionado.getConNumero(), FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String listarAmbientesEstado() {
        try {
            Calendar c = Calendar.getInstance();
            c.setTime(new Date());
            c.add(Calendar.DAY_OF_MONTH, 6);
            int result = c.getTime().compareTo(fechaAmbiente);
            System.out.println("result: " + result);
//            if (result <= 0) {
                List<ReservaAmbiente> listaReserva = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReserva = delegate.listarReserva_Dia(fechaAmbiente, ambiente);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    boolean var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReserva) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setTipo(0);
                        adap.setAmbiente(ambiente);
                        adap.setNombre(ambiente.getAmbNombre());
                        listaCalendario.add(adap);
                    }
                }
//            } else {
//                listaCalendario.clear();
//                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//                c.add(Calendar.DAY_OF_MONTH, 1);
//                String fecha = sdf.format(c.getTime());
//                mostrarMensaje("Error: ", "Los Ambientes se reservan con una semana antes de anticipacion  de la fecha Actual, ejemplo: " + fecha, FacesMessage.SEVERITY_ERROR);
//            }
        } catch (Exception e) {
            mostrarMensaje("Error: ", e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "";
    }

    public String calcularMontosEnLista() {
        try {
            for (Contrato con : listaContrato) {
                //Double dblGarantia = con.getConGarantia();
                Double dblDescuento = con.getCondescuento();
                Double dblSubTotal = con.getConsubTotal();
                Double dblIgv = calcularIgv(dblSubTotal);
                Double dblMontoTotal = dblSubTotal + dblIgv;
                dblDescuento = (dblDescuento != null) ? dblDescuento : 0D;
                Double dblMontoAPagar = dblMontoTotal;
                //Double dblMontoAPagar = calcularMontoAPagar(dblMontoTotal, dblDescuento);
                con.setConIGV(dblIgv);
                con.setCodmontoTotal(dblMontoTotal);
                con.setConApagar(dblMontoAPagar);
                delegateContrato.actualizar_Contrato(con);
            }
            mostrarMensaje("INFO: ", "Se calcularon con exito todos los contratos", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En calcular los montos del contrato N°: " + contratoSeleccionado.getConNumero(), FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String cancelarContrato() {
        try {
            contrato = new Contrato();
//            fecha = null;
//            var = false;
            persona = new PersonaNatural();
            empresa = new PersonaJuridica();
            ruc = null;
            dni = null;
            listaCalendario1 = new ArrayList<CalendarioAmbientesAdapter>();
            listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
            subTotal=montoTotal=descuento=descuentoPorcentaje=montoSinDescuento=0.0;
            inicializar();
            tabber = "busquedas";
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", "En cancelar contrato", FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    @SuppressWarnings("static-access")
    public String visualizar() {
        llenarDatosAntesVisualizar();
        RutaCarpetaReporte ruta = new RutaCarpetaReporte();
        String rutaJasper = "", rutaPDF = "";
        rutaJasper = ruta.getRutaReporte() + "ContratoAmbienteEventos.jasper";
        rutaPDF = ruta.getRutaPDF() + "ContratoAmbienteEventos.pdf";
        //rutaPDF = ruta.getRutaReporte() + "ContratoAmbienteEventos.pdf";
//        for (int i = 0; i < listaCalendario1.size(); i++) {
//            listaCalendario1.get(i).setConsejo(ruta.getConsejo());
//        }
        try {
            //lizardo estuvo aqui
            PersonaNatural per = new PersonaNatural();
            PersonaJuridica emp = new PersonaJuridica();
            String nombreContratante;
            String logoReporte = ruta.getRutaLogo();
            String nroDocumento;
            String direccionContratante;
            if (contratoSeleccionado.getConTipo()) {
                emp = delegate.encontrarEmpresa(contratoSeleccionado.getSolCodigo().getSolCodigo());
                nombreContratante = emp.getEmprazonSocial();
                nroDocumento = emp.getNumeroRUC();
            } else {
                per = delegate.encontrarPersona(contratoSeleccionado.getSolCodigo().getSolCodigo());
                nombreContratante = per.getApellidosNombres();
                nroDocumento = per.getPerNroDNI();
            }
            DireccionPersona dir = new DireccionPersona();
            dir = delegate.encontrarDireccionActivo(contratoSeleccionado.getSolCodigo().getSolCodigo());
            direccionContratante = (dir.getDpeCodigo() != null) ? dir.getDireccionGeneral() : "<No tiene dirección registrada>";
            dir = null; per = null; emp = null;
            Map parametros = new HashMap();
            parametros.put("nombreConsejo", ruta.getConsejo().getCdeDescripcion());
            //parametros.put("rutaLogo", ruta.getConsejo().getCdeLogoReporte());
            parametros.put("rutaLogo", logoReporte);
            parametros.put("nroContrato", contratoSeleccionado.getConNumero());
            parametros.put("nombreContratante", nombreContratante);
            parametros.put("direccionContratante", direccionContratante);
            parametros.put("tipoDocumento", (contratoSeleccionado.getConTipo()) ? "RUC: " : "DNI: ");
            parametros.put("documentoContratante", nroDocumento);
            parametros.put("subTotal", subTotal);
            parametros.put("igv", igvContrato);
            parametros.put("total", montoTotal);
            parametros.put("descuento", descuento);
            parametros.put("aPagar", montoAPagar);
            File entrada = new File(rutaJasper);
            //lizardo estuvo aqui
            //JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), null, new JRBeanCollectionDataSource(listaCalendario1));
            JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), parametros, new JRBeanCollectionDataSource(listaReservasAdapter));
            if (ruta.generarPDF(rutaPDF, print)) {}
        } catch (Exception e) {
            System.out.println("-------" + e.toString());
        }
        return "";
    }

    public String recuperarDireccionGeneral(DireccionPersona dirPersona) {
        String direccionPersona = "";
        if (dirPersona.getDpeDireccion() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeDireccion()))
                direccionPersona = dirPersona.getDpeDireccion() + " ";
        }
        if (dirPersona.getDpeDpto() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeDpto()))
                direccionPersona += "Dpto: " + dirPersona.getDpeDpto() + " ";
        }
        if (dirPersona.getDpePiso() != null) {
            direccionPersona += "Piso: " + dirPersona.getDpePiso() + " ";
        }
        if (dirPersona.getDpeNro() != null) {
            direccionPersona += "Nro: " + dirPersona.getDpeNro() + " ";
        }
        if (dirPersona.getDpenombreZona() != null) {
            if (Utiles.validarStrings(dirPersona.getDpenombreZona()))
                direccionPersona += "Zona: " + dirPersona.getDpenombreZona() + " ";
        }
        if (dirPersona.getDpeManzana() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeManzana()))
                direccionPersona += "Mz: " + dirPersona.getDpeManzana() + " ";
        }
        if (dirPersona.getDpeLote() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeLote()))
                direccionPersona += "Lote: " + dirPersona.getDpeLote() + " ";
        }
        if (dirPersona.getDpeEtapa() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeEtapa()))
                direccionPersona += "Etapa: " + dirPersona.getDpeEtapa() + " ";
        }
        if (dirPersona.getDpeSector() != null) {
            if (Utiles.validarStrings(dirPersona.getDpeSector()))
                direccionPersona += "Sector: " + dirPersona.getDpeSector();
        }
        return direccionPersona;
    }

    @SuppressWarnings("static-access")
    public String visualizarV2() {
        llenarDatosAntesVisualizarV2();
        RutaCarpetaReporte ruta = new RutaCarpetaReporte();
        String rutaJasper = "", rutaPDF = "";
        rutaJasper = ruta.getRutaReporte() + "ContratoAmbienteEventos.jasper";
        rutaPDF = ruta.getRutaPDF() + "ContratoAmbienteEventos.pdf";
        try {
            //lizardo estuvo aqui
            PersonaNatural per = new PersonaNatural();
            PersonaJuridica emp = new PersonaJuridica();
            String nombreContratante;
            String logoReporte = ruta.getRutaLogo();
            String nroDocumento;
            String direccionContratante;
            if (contratoSeleccionado.getConTipo()) {
                emp = delegate.encontrarEmpresa(contratoSeleccionado.getSolCodigo().getSolCodigo());
                nombreContratante = emp.getEmprazonSocial();
                nroDocumento = emp.getNumeroRUC();
            } else {
                per = delegate.encontrarPersona(contratoSeleccionado.getSolCodigo().getSolCodigo());
                nombreContratante = per.getApellidosNombres();
                nroDocumento = per.getPerNroDNI();
            }
            DireccionPersona dir = new DireccionPersona();
            dir = delegate.encontrarDireccionActivo(contratoSeleccionado.getSolCodigo().getSolCodigo());
//            direccionContratante = (dir.getDpeCodigo() != null) ? dir.getDireccionGeneral() : "<No tiene dirección registrada>";
            direccionContratante = (dir.getDpeCodigo() != null) ? recuperarDireccionGeneral(dir) : "<No tiene dirección registrada>";
            System.out.println("direccion: " + direccionContratante);
            dir = null; per = null; emp = null;
            Map parametros = new HashMap();
            parametros.put("nombreConsejo", ruta.getConsejo().getCdeDescripcion());
            //parametros.put("rutaLogo", ruta.getConsejo().getCdeLogoReporte());
            parametros.put("rutaLogo", logoReporte);
            parametros.put("nroContrato", contratoSeleccionado.getConNumero());
            parametros.put("nombreContratante", nombreContratante);
            parametros.put("direccionContratante", direccionContratante);
            parametros.put("tipoDocumento", (contratoSeleccionado.getConTipo()) ? "RUC: " : "DNI: ");
            parametros.put("documentoContratante", nroDocumento);

            //variables propias
            Double dSubTotal = null, dIgv = null, dTotal = null, dDescuento = null;
            dSubTotal = (montos != null) ? montos.getSubTotal() : 0.0;
            dIgv = (montos != null) ? montos.getIgv() : 0.0;
            dTotal = (montos != null) ? montos.getMontoTotal() : 0.0;
            dDescuento = (montos != null) ? montos.getDescuento() : 0.0;
            parametros.put("subTotal", dSubTotal);
            parametros.put("igv", dIgv);
            parametros.put("total", dTotal);
            parametros.put("descuento", dDescuento);
//            parametros.put("subTotal", subTotal);
//            parametros.put("igv", igvContrato);
//            parametros.put("total", montoTotal);
//            parametros.put("descuento", descuento);
            //parametros.put("aPagar", montoAPagar);
            File entrada = new File(rutaJasper);
            //lizardo estuvo aqui
            //JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), null, new JRBeanCollectionDataSource(listaCalendario1));
            //JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), parametros, new JRBeanCollectionDataSource(listaReservasAdapter));
            JasperPrint print = JasperFillManager.fillReport(new FileInputStream(entrada), parametros, new JRBeanCollectionDataSource(listaComprobante));
            //listaReservasAdapter
            if (ruta.generarPDF(rutaPDF, print)) {}
        } catch (Exception e) {
            System.out.println("-------" + e.toString());
        }
        return "";
    }

    public String listaContratosxAnular(){
        try{
            listaContrato.clear();
            listaContrato=delegateContrato.listarContratosxAnular();
        }catch(Exception e){
            mostrarMensaje("ERROR: ", "En listar constratos para anular", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public String anularContrato(){
        try{
            if (delegateContrato.anularMovimientoCuenta(contratoSeleccionado.getConCodigo())) {
                contratoSeleccionado.setConEstado(0);
                delegateContrato.actualizar_Contrato(contratoSeleccionado);
                mostrarMensaje("INFO: ", "Se anulo el Contrato Nº "+contratoSeleccionado.getConNumero(), FacesMessage.SEVERITY_INFO);
                mostrarMensaje("INFO: ", "Se anulo todos sus movimientos cuenta para tesoreria", FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("WARN: ", "No se anularon los movimiento cuenta de este contrato: "+contratoSeleccionado.getConNumero(), FacesMessage.SEVERITY_WARN);
            }
            //listaContratosxAnular();
            //inicializar();
        }catch(Exception e){
            mostrarMensaje("ERROR: ", "En anular constratos", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + e.getMessage());
        }
        return null;
    }

    public String confirmarContrato() {
        try {
            //InscripcionEventoDelegate deuda = new InscripcionEventoDelegate();
            boolean tipo;
            Integer codigo;
            Long moneda;
            Double total;
            String descripcion;
            moneda = (contratoSeleccionado.getConTipoMoneda() != null) ? contratoSeleccionado.getConTipoMoneda() : 0;
            if (moneda == 0) {
                mostrarMensaje("WARN: ", "Seleccione el tipo de moneda", FacesMessage.SEVERITY_WARN);
                return null;
            }
            MovimientoCuentaDelegate delegateCuenta = new MovimientoCuentaDelegate();
            //generar la Deuda a tesoreria de contratos para los ambientes
            List<ReservaAmbienteAgrupadaAdapter> listaReservaAmbienteAgrupada = new ArrayList<ReservaAmbienteAgrupadaAdapter>();
            listaReservaAmbienteAgrupada = delegate.listarReservaAmbientesAgrupadas(contratoSeleccionado.getConCodigo());

//            if (listaReservaAmbienteAgrupada.size()==0) {
//                mostrarMensaje("WARN: ", "Consulte con su administrador o revise si han sido creadas las cuentas de ingreso para los ambientes", FacesMessage.SEVERITY_WARN);
//                return null;
//            }

            for (ReservaAmbienteAgrupadaAdapter ram : listaReservaAmbienteAgrupada) {
                if (ram.getAmbiente() != null) {
                    tipo = true;
                    codigo = ram.getAmbiente().getAmbCodigo();
                    igv = (igv != null) ? igv : 0.19;
                    total = ram.getTotal() * igv;
                    total = Utiles.redondearDouble(total, 2);
                    descripcion = ram.getAmbiente().getAmbNombre();
                } else {
                    codigo = null;
                    total = null;
                    mostrarMensaje("ERROR: ", "Consulte con el administrador del sistema si los datos de los ambientes o equipos fueron ingresados correctamente", FacesMessage.SEVERITY_ERROR);
                    return null;
                }
                CuentaIngreso cin = new CuentaIngreso();
                cin = delegateContrato.dameCuentaIngresoXAmbienteServicio(tipo, codigo, moneda);
                if (cin.getCinCodigo() == null) {
                    mostrarMensaje("ERROR: ", "Consulte con tesoreria la creacion de las cuentas de ingresos para los ambientes o equipos", FacesMessage.SEVERITY_ERROR);
                    return null;
                }
                Calendar cal = Calendar.getInstance();
                cal.setTime((contratoSeleccionado.getConfechaContrato() != null) ? contratoSeleccionado.getConfechaContrato() : new Date());
                int anio = cal.get(Calendar.YEAR);
                int mes = cal.get(Calendar.MONTH) + 1;

                MovimientoCuenta mcu = new MovimientoCuenta();
                mcu.setMcuMonto(total);
                mcu.setMcuSaldo(total);
                mcu.setEstado(EnumEstadoMovimiento.Impaga);
                mcu.setMcuAnio(anio);
                mcu.setMcuMes(mes);
                mcu.setMcuFechvencimiento(contratoSeleccionado.getConVencimiento());
                mcu.setFkCinCodigo(cin);
                mcu.setFkSolCodigo(contratoSeleccionado.getSolCodigo());
                mcu.setTipoDeuda(EnumTipoDeuda.EVENTO);
                mcu.setDescripcion(descripcion);
                mcu.setPagoParcial(contratoSeleccionado.getConPagoParcial());
                delegateCuenta.crearDeuda(mcu);
                System.out.println("OK PROCEDIMIENTO PARA LOS AMBIENTES");
                cin = null;
                mcu = null;
            }

            //generar la Deuda a tesoreria de contratos para los servicios o equipos
            List<ReservaAmbienteAgrupadaAdapter> listaReservaServicioAgrupada = new ArrayList<ReservaAmbienteAgrupadaAdapter>();
            listaReservaServicioAgrupada = delegate.listarReservaServiciosAgrupadas(contratoSeleccionado.getConCodigo());

//            if (listaReservaServicioAgrupada.size()==0) {
//                mostrarMensaje("WARN: ", "Consulte con su administrador o revise si han sido creadas las cuentas de ingreso para los servicios o equipos", FacesMessage.SEVERITY_WARN);
//                return null;
//            }
            for (ReservaAmbienteAgrupadaAdapter ram : listaReservaServicioAgrupada) {
                if (ram.getServicio() != null) {
                    tipo = false;
                    codigo = ram.getServicio().getSerCodigo();
                    total = ram.getTotal();
                    descripcion = ram.getServicio().getSerNombre();
                } else {
                    codigo = null;
                    total = null;
                    mostrarMensaje("ERROR: ", "Consulte con el administrador del sistema si los datos de los ambientes o equipos fueron ingresados correctamente", FacesMessage.SEVERITY_ERROR);
                    return null;
                }
                CuentaIngreso cin = new CuentaIngreso();
                cin = delegateContrato.dameCuentaIngresoXAmbienteServicio(tipo, codigo, moneda);
                if (cin.getCinCodigo() == null) {
                    mostrarMensaje("ERROR: ", "Consulte con tesoreria la creacion de las cuentas de ingresos para los ambientes o equipos", FacesMessage.SEVERITY_ERROR);
                    return null;
                }
                Calendar cal = Calendar.getInstance();
                cal.setTime((contratoSeleccionado.getConfechaContrato() != null) ? contratoSeleccionado.getConfechaContrato() : new Date());
                int anio = cal.get(Calendar.YEAR);
                int mes = cal.get(Calendar.MONTH) + 1;

                MovimientoCuenta mcu = new MovimientoCuenta();
                mcu.setMcuMonto(total);
                mcu.setMcuSaldo(total);
                mcu.setEstado(EnumEstadoMovimiento.Impaga);
                mcu.setMcuAnio(anio);
                mcu.setMcuMes(mes);
                mcu.setMcuFechvencimiento(contratoSeleccionado.getConVencimiento());
                mcu.setFkCinCodigo(cin);
                mcu.setFkSolCodigo(contratoSeleccionado.getSolCodigo());
                mcu.setTipoDeuda(EnumTipoDeuda.EVENTO);
                mcu.setDescripcion(descripcion);
                mcu.setPagoParcial(contratoSeleccionado.getConPagoParcial());
                delegateCuenta.crearDeuda(mcu);
                System.out.println("OK PROCEDIMIENTO PARA LOS SERVICIOS O EQUIPOS");
                cin = null;
                mcu = null;
            }
            delegateCuenta = null;
            //Cambiar el estado de los contratos
            contratoSeleccionado.setConEstado(3);   //Confirmado
            delegateContrato.actualizar_Contrato(contratoSeleccionado);
            //inicializar();
            mostrarMensaje("INFO: ", "Este Contrato Nº "+contratoSeleccionado.getConNumero() + " ha sido confirmado.", FacesMessage.SEVERITY_WARN);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En confirmar contrato...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String confirmarContratoV2() {
        try {
            //InscripcionEventoDelegate deuda = new InscripcionEventoDelegate();
            boolean tipo;
            Integer codigo;
            Integer conCodigo;
            Long moneda;
            Double total;
            String descripcion;
            llenarDatosAntesVisualizarV2();
            conCodigo = contratoSeleccionado.getConCodigo();
            if (conCodigo == null) {
                mostrarMensaje("WARN: ", "No hay contrato para generar movimientos cuenta", FacesMessage.SEVERITY_WARN);
                return null;
            }
            moneda = (contratoSeleccionado.getConTipoMoneda() != null) ? contratoSeleccionado.getConTipoMoneda() : 0;
            if (moneda == 0) {
                mostrarMensaje("WARN: ", "Seleccione el tipo de moneda", FacesMessage.SEVERITY_WARN);
                return null;
            }
            MovimientoCuentaDelegate delegateCuenta = new MovimientoCuentaDelegate();
            //generar la Deuda a tesoreria de contratos para los ambientes
            for (ComprobanteAdapter com : listaComprobante) {
                tipo = (com.getTipo()==0) ? true : false;
                codigo = com.getAmbServicio();
                igv = (igv != null) ? igv : 0.19;
                total = com.getImporte() * (1 + igv);
                total = Utiles.redondearDouble(total, 2);
                descripcion = com.getDescripcion() + " reservado el " + com.getFecha();
                CuentaIngreso cin = new CuentaIngreso();
                cin = delegateContrato.dameCuentaIngresoXAmbienteServicio(tipo, codigo, moneda);
                if (cin.getCinCodigo() == null) {
                    mostrarMensaje("ERROR: ", "Consulte con tesoreria la creacion de las cuentas de ingresos para los ambientes o equipos", FacesMessage.SEVERITY_ERROR);
                    return null;
                }
                Calendar cal = Calendar.getInstance();
                cal.setTime((contratoSeleccionado.getConfechaContrato() != null) ? contratoSeleccionado.getConfechaContrato() : new Date());
                int anio = cal.get(Calendar.YEAR);
                int mes = cal.get(Calendar.MONTH) + 1;

                MovimientoCuenta mcu = new MovimientoCuenta();
                mcu.setMcuMonto(total);
                mcu.setMcuSaldo(total);
                mcu.setEstado(EnumEstadoMovimiento.Impaga);
                mcu.setMcuAnio(anio);
                mcu.setMcuMes(mes);
                mcu.setMcuFechvencimiento(contratoSeleccionado.getConVencimiento());
                mcu.setFkCinCodigo(cin);
                mcu.setFkSolCodigo(contratoSeleccionado.getSolCodigo());
                mcu.setTipoDeuda(EnumTipoDeuda.EVENTO);
                mcu.setDescripcion(descripcion);
                mcu.setPagoParcial(contratoSeleccionado.getConPagoParcial());
                mcu.setConCodigo(conCodigo);
                delegateCuenta.crearDeuda(mcu);
                System.out.println("OK PROCEDIMIENTO PARA LOS AMBIENTES");
                cin = null;
                mcu = null;
            }
            delegateCuenta = null;
            //Cambiar el estado de los contratos
            contratoSeleccionado.setConEstado(3);   //Confirmado
            delegateContrato.actualizar_Contrato(contratoSeleccionado);
            //inicializar();
            mostrarMensaje("INFO: ", "Este Contrato Nº "+contratoSeleccionado.getConNumero() + " ha sido confirmado.", FacesMessage.SEVERITY_WARN);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En confirmar contrato...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    private void dameNombreDscto() {
        tipoDescuento = (tipoDescuento != null) ? tipoDescuento : 0;
        switch (tipoDescuento) {
            case 0: nombreDscto = "Descuento";  break;
            case 1: nombreDscto = "Dscto (%)";  break;
            case 2: nombreDscto = "Dscto S/.";
        }
    }

    private Double mostrarIgvVigente() {
        Double porcIgv = 0D;
        try {
            Igv igvVigente = new Igv();
            igvVigente = delegateContrato.igvVigente();
            porcIgv = (igvVigente != null) ? igvVigente.getIgvValor() : 0D;
            porcIgv /= 100;
            igvVigente = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Revise si esta habilitado el igv vigente", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
            porcIgv = 0D;
        }
        return porcIgv;
    }

    public String agregarAmbSeleccionados() {
        for (CalendarioAmbientesAdapter cal : listaCalendario) {
            if (cal.getReservar()) {
                cal.setFecha(fechaAmbiente);
                listaCalendario1.add(cal);
            }
        }
        for (CalendarioAmbientesAdapter cal : listaCalendario1) {
            listaCalendario.remove(cal);
        }

        return "";
    }

    public String listarServiciosEstado() {
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.add(Calendar.DAY_OF_MONTH, 6);
//        if (c.getTime().compareTo(fechaAmbiente) <= 0) {
            try {
                List<ReservaAmbiente> listaReserva = new ArrayList<ReservaAmbiente>();
                listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
                listaReserva = delegate.listarReserva_Dia(fechaAmbiente, equipo);
                //Cargar Ambientes
                for (int i = 7; i < 24; i++) {
                    int j;
                    boolean var = true;
                    j = i + 1;
                    for (ReservaAmbiente res : listaReserva) {
                        if (res.getReahoraInicio() == i) {
                            var = false;
                        }
                    }
                    if (var) {
                        CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                        adap.setHoraInicio(new Double(i));
                        adap.setHoraFin(new Double(j));
                        adap.setHorario(i + ".00  - " + i + ".50");
                        adap.setEstado("RESERVAR");
                        adap.setHabilitado(true);
                        adap.setTipo(1);
                        adap.setServicio(equipo);
                        adap.setNombre(equipo.getSerNombre());
                        listaCalendario.add(adap);
                    }

                }
            } catch (Exception e) {
                System.out.println("Errorrr " + e.toString());
            }
//        } else {
//            listaCalendario.clear();
//            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//            c.add(Calendar.DAY_OF_MONTH, 1);
//            String fecha = sdf.format(c.getTime());
//            mostrarMensaje("Error: ", "Los Ambientes se reservan con una semana antes de anticipacion  de la fecha Actual, ejemplo: " + fecha, FacesMessage.SEVERITY_ERROR);
//        }

        return "";
    }

    public String listarReservasDisponibles() {
        try {
            List<ReservaAmbiente> listaReserva = new ArrayList<ReservaAmbiente>();
            listaCalendario = new ArrayList<CalendarioAmbientesAdapter>();
            if (tipoAmbiente==1) {
                listaReserva = delegate.listarReservas(fechaAmbiente, ambiente.getAmbCodigo(), true);
            } else {
                listaReserva = delegate.listarReservas(fechaAmbiente, equipo.getSerCodigo(), false);
            }
            //Cargar Ambientes
            String formatoHora;
            int hora;
            for (int i = 7; i < 24; i++) {
                int j;
                boolean var = true;
                j = i + 1;
                for (ReservaAmbiente res : listaReserva) {
                    hora = res.getReahoraInicio().intValue();
                    if (hora == i) {
                        var = false;
                        break;
                    }
                }
                if (var) {
                    CalendarioAmbientesAdapter adap = new CalendarioAmbientesAdapter();
                    adap.setHoraInicio(new Double(i));
                    adap.setHoraFin(new Double(j));
                    formatoHora = Utiles.rellenarCeros(Utiles.aCadena(i),2);
                    adap.setHorario(formatoHora + ".00  - " + formatoHora + ".50");
                    adap.setEstado("RESERVAR");
                    adap.setHabilitado(true);
                    if (tipoAmbiente==1) {
                        adap.setTipo(0);
                        adap.setAmbiente(ambiente);
                        adap.setNombre(ambiente.getAmbNombre());
                    } else {
                        adap.setTipo(1);
                        adap.setServicio(equipo);
                        adap.setNombre(equipo.getSerNombre());
                    }
                    listaCalendario.add(adap);
                }
            }
        } catch (Exception e) {
            mostrarMensaje("ERROR: ", e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public String reservarAmbienteServicio() {
        try {
            Double costoParcial;
            for (CalendarioAmbientesAdapter cal : listaCalendario) {
                ReservaAmbiente res = new ReservaAmbiente();
                if (cal.getReservar()) {
                    res.setContrato(contratoSeleccionado);
                    if (tipoAmbiente==1) {
                        res.setAmbCodigo(ambiente);
                        res.setReaTipoae(0);
                        costoParcial = ambiente.getAmbCosto();
                    } else {
                        res.setSerCodigo(equipo);
                        res.setReaTipoae(1);
                        costoParcial = equipo.getSerCosto();
                    }
                    res.setReaEstado("RESERVADO");
                    res.setReaFecha(fechaAmbiente);
                    res.setReaNombreEvento("Contrato");
                    res.setReaTipoec(0);
                    res.setReahoraInicio(cal.getHoraInicio());
                    res.setReahoraFin(cal.getHoraFin());
                    res.setReamontoParcial(costoParcial);
                    delegate.registrar(res);
                }
            }
            if (listaCalendario.size()>0) {
                buscarReservas();
                mostrarMensaje("INFO: ", "Se agregaron las reservas con exito", FacesMessage.SEVERITY_INFO);
            }
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En reservas los ambientes o equipos del contratante", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public SelectItem[] getComboTipoMoneda() {
        //Combo Eventos en Curso
        try {
            List<TipoMoneda> listaTipoMoneda = new ArrayList<TipoMoneda>();
            listaTipoMoneda = delegateContrato.listarTipoMoneda();
            SelectItem[] comboTipoMoneda = new SelectItem[listaTipoMoneda.size()];
            int i = 0;
            for (TipoMoneda tmo : listaTipoMoneda) {
                comboTipoMoneda[i] = new SelectItem(tmo.getTmoCodigo(), tmo.getTmoSimbolo());
                i++;
            }
            return comboTipoMoneda;

        } catch (Exception e) {
            //Mensaje al usuario
            System.out.println("Error combo Tipo Moneda --" + e.toString());
            SelectItem[] comboTipoMoneda = new SelectItem[1];
            comboTipoMoneda[0] = new SelectItem(0, "No hay tipos de moneda");
            return comboTipoMoneda;
        }
    }

}